#include <iostream>
#include <unistd.h>
#include <fcntl.h>
#include <cstdio>

void SetNonBlock(int fd)
{
	int fl = fcntl(fd, F_GETFL); //先获取一下对应文件的struct file对象的文件标志位
	if(fl < 0)
	{
		perror("fcntl");
		return;
	}
	fcntl(fd, F_SETFL, fl | O_NONBLOCK);//O_NONBLOCK : 将fd设置为非阻塞
}

int main()
{
	SetNonBlock(0);

	char buffer[1024];
	while(true)
	{
		ssize_t n = read(0, buffer,sizeof(buffer));
		if(n > 0)
		{
			buffer[n-1] = 0;
			std::cout<< buffer <<std::endl;
		}
		else if(n < 0)
		{
			//1.读取出错 2.底层没有数据准备好
			if(errno == EAGAIN || errno == EWOULDBLOCK)
			{
				std::cout << "数据没有准备好......" << std::endl;
				sleep(1);
				//做自己的事情
				continue;
			}
			else if(errno == EINTR)
			{
				continue;//重新读
			}
			else
			{
				//这是真的read出错了！
				perror("read");
				return -1;
			}
		}
		else
		{
			break;
		}
		//TODO
		//sleep(1);
		//std::cout << "."; //这样的话键盘输入回车，并不会打印出来效果，这是因为C++有语言级的输出缓冲区，没有满足刷新条件
		//std::cout << ".:" << n << std::endl;
	}
	return 0;
}
